package handler

import (
	"gitee.com/fu-ce-wei/pi-mapper/dto"
	"gitee.com/fu-ce-wei/pi-mapper/internal/service"
	"gitee.com/fu-ce-wei/pi-mapper/pkg/logger"
	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
	"net/http"
	"strconv"
)

// ImageHandler 图片处理器
type ImageHandler struct {
	imageService service.ImageService
	logger       *logger.Logger
}

// NewImageHandler 创建图片处理器实例
func NewImageHandler(imageService service.ImageService, logger *logger.Logger) *ImageHandler {
	return &ImageHandler{
		imageService: imageService,
		logger:       logger,
	}
}

// GetImageList 获取图片列表
// @Summary 获取随机图片列表
// @Description 从Redis中获取随机图片列表，返回包含完整URL的图片信息
// @Tags 图片
// @Accept json
// @Produce json
// @Param count query int false "返回图片数量，默认5个，最大20个" default(5) minimum(1) maximum(20)
// @Success 200 {object} dto.ImageListResponse
// @Failure 400 {object} dto.ErrorResponse
// @Failure 500 {object} dto.ErrorResponse
// @Router /api/v1/images/list [get]
func (h *ImageHandler) GetImageList(c *gin.Context) {
	// 解析请求参数
	countStr := c.DefaultQuery("count", "5")
	count, err := strconv.Atoi(countStr)
	if err != nil {
		h.logger.Error("解析count参数失败", zap.Error(err))
		c.JSON(http.StatusBadRequest, dto.ErrorResponse{
			Code:      http.StatusBadRequest,
			Message:   "无效的count参数",
			Details:   err.Error(),
			Timestamp: getCurrentTime(),
		})
		return
	}

	// 调用服务层获取图片列表
	response, err := h.imageService.GetImageList(c.Request.Context(), count)
	if err != nil {
		h.logger.Error("获取图片列表失败", zap.Error(err))
		c.JSON(http.StatusInternalServerError, dto.ErrorResponse{
			Code:      http.StatusInternalServerError,
			Message:   "获取图片列表失败",
			Details:   err.Error(),
			Timestamp: getCurrentTime(),
		})
		return
	}

	c.JSON(http.StatusOK, response)
}

// GetImageInfo 获取单个图片信息
// @Summary 获取图片详细信息
// @Description 获取指定图片的详细信息，包括文件大小和创建时间
// @Tags 图片
// @Accept json
// @Produce json
// @Param filename path string true "图片文件名"
// @Success 200 {object} dto.ImageResponse
// @Failure 400 {object} dto.ErrorResponse
// @Failure 404 {object} dto.ErrorResponse
// @Failure 500 {object} dto.ErrorResponse
// @Router /api/v1/images/{filename} [get]
func (h *ImageHandler) GetImageInfo(c *gin.Context) {
	filename := c.Param("filename")
	if filename == "" {
		c.JSON(http.StatusBadRequest, dto.ErrorResponse{
			Code:      http.StatusBadRequest,
			Message:   "文件名不能为空",
			Timestamp: getCurrentTime(),
		})
		return
	}

	// 调用服务层获取图片信息
	info, err := h.imageService.GetImageInfo(c.Request.Context(), filename)
	if err != nil {
		h.logger.Error("获取图片信息失败", zap.Error(err))

		if err.Error() == "文件不存在" {
			c.JSON(http.StatusNotFound, dto.ErrorResponse{
				Code:      http.StatusNotFound,
				Message:   "图片文件不存在",
				Details:   err.Error(),
				Timestamp: getCurrentTime(),
			})
		} else {
			c.JSON(http.StatusInternalServerError, dto.ErrorResponse{
				Code:      http.StatusInternalServerError,
				Message:   "获取图片信息失败",
				Details:   err.Error(),
				Timestamp: getCurrentTime(),
			})
		}
		return
	}

	c.JSON(http.StatusOK, info)
}
